package com.sunfeng.n3;

import com.sunfeng.TimeUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * 两阶段终止模式
 * 如何优雅的关闭线程
 *
 * @author sunfeng
 * @date 2021/03/16 17:13
 **/

@Slf4j(topic = "c.Test13")
public class Test13 {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            /**
             *  线程中执行相应的循环操作
             *
             *  当我们的线程被打断的时候 在异常出设置打断标记
             */
            while (true) {
                Thread currentThread = Thread.currentThread();
                if (currentThread.isInterrupted()) {
                    log.debug("线程被打断，终止执行任务");
                    return;
                }
                try {
                    TimeUnit.SECONDS.sleep(2);
                } catch (InterruptedException e) {
                    /**
                     * 。如果线程在sleep()时被中断，会抛出中断异常，但中断标识位会被清除，可以捕获到中断异常后手动中断线程，Thread th = Thread.currentThread()；
                     */
                    log.error("线程被打断，修改线程状态标志位");
                    currentThread.interrupt();
                }


            }
        });

        t1.start();
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t1.interrupt();

    }
}
